#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//int main()
//{
//    unsigned char puc[4];
//    struct tagPIM
//    {
//        unsigned char ucPim1;
//        unsigned char ucData0 : 1;
//        unsigned char ucData1 : 2;
//        unsigned char ucData2 : 3;
//    }*pstPimData;
//
//    pstPimData = (struct tagPIM*)puc;
//    memset(puc, 0, 4);
//    pstPimData->ucPim1 = 2;
//    pstPimData->ucData0 = 3;
//    pstPimData->ucData1 = 4;
//    pstPimData->ucData2 = 5;
//    printf("%02x %02x %02x %02x\n", puc[0], puc[1], puc[2], puc[3]);
//    return 0;
//}


//#define MAX_SIZE 2+3
//int main() {
//	struct _Record_Struct{
//		//前两个变量共用一个字节
//		unsigned char Env_Alarm_ID : 4;
//		unsigned char Para1 : 2;
//		//state用一个字节
//		unsigned char state;
//		//最后一个字节用一个字节的一个bit位
//		unsigned char avail : 1;
//	}*Env_Alarm_Record;
//
//	//MAX_SIZE会被替换为 2 + 3 
//	//sizeof(struct _Record_Struct) * MAX_SIZE 会被替换为  3 * 2 + 3 
//	// ！！！！！！要注意宏定义的直接替换，宏定义要注意替换后的优先级问题
//	//结果为9
//	struct _Record_Struct* pointer = (struct _Record_Struct*)malloc(sizeof(struct _Record_Struct) * MAX_SIZE);
//	return 0;
//}


//int main(){
//    unsigned char puc[4];
//    struct tagPIM{
//        //第一个变量用一个字节
//        unsigned char ucPim1;
//        //后面三个变量用一个字节
//        unsigned char ucData0 : 1;
//        unsigned char ucData1 : 2;
//        unsigned char ucData2 : 3;
//    }*pstPimData;
//
//    pstPimData = (struct tagPIM*)puc;
//
//    //把puc指向的地址全部置为0
//    memset(puc, 0, 4);
//
//    //第一个变量的2正常存放
//    pstPimData->ucPim1 = 2;
//    //第二个变量只有1个bit位可以存放，3存进一个bit位 发生截断 只存进一个1
//    pstPimData->ucData0 = 3;
//    //第三个变量有两个bit位可以存放，4存进两个bit位100 发生截断 只存进个00
//    pstPimData->ucData1 = 4;
//    //第四个变量有三个bit位可以存放，5存进三个bit位101 发生截断 可以存进所有有效数据位101
//    pstPimData->ucData2 = 5;
//
//    //此时puc指向空间的内存存放为 10010100 由于是小端机存储
//    // 低位存在低地址，而且存放的是无符号char 原反补相同  
//    // 所以真实的值为 00101001
//    
//    //而puc的类型为struct tagPIM* 所以一次向后访问两个字节 而结构体中只有前两个字节有数据
//    //所以puc[0]访问到ucPim1的数据 也就是2
//    //puc[1] 就会访问到 00101001 转为16进制为 29
//    printf("%02x %02x %02x %02x\n", puc[0], puc[1], puc[2], puc[3]);
//    //最后的打印为 02 29 00 00
//    return 0;
//}

#include<stdio.h>
int main(){
    union{
        short k;
        char i[2];
    }*s, a;

    s = &a;

    //联合体的成员共用两个字节空间
    //第一个字节存入0x39
    //第二个字节存入0x38
    //此时这两个字节空间变成 39 38
    //但是在X86下，小端字节序存储情况下
    //a.k 来访问这两个字节空间，会从高地址读向低地址
    //a.k的值就会变为 0x3839
    s->i[0] = 0x39;
    s->i[1] = 0x38;

    printf("%x\n", a.k);
    return 0;
}